文字数・文字列検索


文字数を数える
文字列の文字数を数えるには、「Len」関数を使用します。文字列の文字数を調べるには「Len」関数、文字列のバイト数を調べるには「LenB」関数を使用します。
処理内容:文字列の文字数を数えます。
Sub Len_1()
strName = "ExcelVBAマニュアル"
MsgBox Len(strName) ' 13
を表示します。
End Sub
処理内容:文字列のバイト数を数えます。
Sub Len_2()
strName = "ExcelVBAマニュアル"
MsgBox LenB(strName) ' 26
を表示します。
End Sub
処理内容:全角文字を2、半角文字を1として数えます。
Sub Len_3()
strName = "ExcelVBAマニュアル"
MsgBox LenB(StrConv(strName, vbFromUnicode)) '
18 を表示します。
End Sub
処理内容:全角文字を2、半角文字を1として数えます。
Sub Insert_4()
Dim strName As String,ZenkakuNum As Integer
Dim StrLenNum As Integer,StrNum As Integer
strName = "ExcelVBAマニュアル"
For i = 1 To Len(strName)
If Asc(Mid(strName, i, 1)) < 0 Or Asc(Mid(strName, i, 1)) > 256 Then
ZenkakuNum = ZenkakuNum + 1
End If
Next i
StrLenNum = Len(strName)
StrNum = StrLenNum + ZenkakuNum
MsgBox StrNum '
18 を表示します。
End Sub


文字列の比較方法の指定
文字列データの既定の比較方法を設定するには、「Option Compare」ステートメントをモジュールの宣言領域(モジュール内のどのプロシージャよりも前)に記述します。
比較方法 には、Binary モード、Text モード、Database モード(Microsoft
Accessでのみ使用可)があり、Option Compare ステートメントが記述されていないモジュールでは、既定のBinary モードが使われます。
Binary (バイナリ)モードでは、大文字・小文字、半角・全角、ひらがな・カタカナを区別し、 ASCII コード順に比較が行われます。
Text (テキスト)モードでは、大文字・小文字、半角・全角、ひらがな・カタカナを区別せず、五十音順に比較が行われます。
[ Binary モードの指定例 ]
Option compare Binary


検索文字列の対象文字列内での位置を検索
ある文字列の中から指定した文字列を検索し、最初に見つかった位置を調べるには、次の方法があります。なお、下表の「関数名」欄で、(VBA)
は VBA関数を、(WS) は ワークシート関数を表します。
下記の関数とは直接関係が有りませんが、参考までに、文字列中に数値が混在している場合、数値の位置を確認する方法、数値だけを取り出す方法を例題の最後に記述しておきます。
関 数 名 |
機 能 と 書 式 |
Instr (VBA) |
ある文字列
の中から指定した文字列を検索し、最初に見つかった文字位置 (先頭からその位置までの文字数) を返します。
書式:InStr([start, ]string1, string2[,compare]) |
引 数 |
内 容 |
start |
省略可能です。検索の開始位置を表す数式を指定します。省略すると、先頭の文字から検索されます。 |
string1 |
必ず指定します。検索対象となる文字列式を指定します。 |
string2 |
必ず指定します。引数 string1 内で検索する文字列式を指定します。 |
compare |
省略可能です。文字列比較の比較モードを指定する番号を設定します。
-1 ・・・ Option Compare ステートメントの設定を使用して比較を行います。
0 ・・・ バイナリ モードの比較を行います。
1 ・・・ テキスト モードの比較を行います。 |
InstrRev (VBA) |
ある文字列の中から指定された文字列を最後の文字位置から検索を開始し、最初に見つかった文字位置 (先頭からその位置までの文字数) を返します。
書式:InstrRev(stringcheck, stringmatch[, start[, compare]])
stringcheck は上記 string1、stringmatch は string2
の内容と同じです。
start を省略すると、最後の文字列から検索されます。 |
FIND (WS) |
指定された文字列 (検索文字列) を他の文字列 (対象)
の中で検索し、その文字列が他の文字列内で最初に現れる位置を左端から数え、その位置の文字番号を返します。
FIND 関数およびFINDB
関数では英字の大文字と小文字を区別できる代わりに、ワイルドカード文字を使用することができません。
書式:FIND(検索文字列, 対象, 開始位置) |
引 数 |
内 容 |
検索文字列 |
検索する文字列を指定します。 |
対象 |
検索文字列 を含む文字列を指定します。 |
開始位置 |
検索を開始する位置を指定します。開始位置 を省略すると、1 を指定したと見なされ、対象 の先頭文字から検索が始まります。 |
FINDB (WS) |
指定された文字列 (検索文字列) を他の文字列 (対象)
の中で検索し、その文字列が他の文字列内で最初に現れる位置を左端から数え、そのバイト数 (半角単位)
を返します。この関数は、全角文字に使用します。
書式:FIND(検索文字列, 対象, 開始位置)
引数の内容は、Find と同じです。 |
SEARCH (WS) |
指定された文字列を他の文字列の中で検索し、その文字列が最初に現れる位置の文字番号を返します。SEARCH 関数では、半角と全角の区別なく 1 文字を 1 として処理が行われます。
SEARCH 関数および SEARCHB 関数ではワイルドカード文字が使用できる代わりに、英字の大文字と小文字を区別することができません。
書式:SEARCH(検索文字列, 対象, 開始位置) |
引 数 |
内 容 |
検索文字列 |
検索文字列 には、半角の疑問符 (?) または半角のアスタリスク (*) をワイルドカード文字として使用することができます。ワイルドカード文字の疑問符は任意の 1
文字を表し、アスタリスクは任意の文字列を表します。ワイルドカード文字ではなく、通常の文字として疑問符やアスタリスクを検索する場合は、その文字の前に、"名古屋市~*" のように半角のチルダ (~) を付けます。 |
対象 |
検索文字列 を含む文字列を指定します。 |
開始位置 |
検索を開始する位置を指定します。 |
SEARCHB (WS) |
指定された文字列を他の文字列の中で検索し、その文字列が最初に現れる位置の番号を返します。1 バイトを
1 文字 (半角文字は 1 バイト、全角文字は 2 バイト)
と数えて文字列の検索を行います。
書式:SEARCHB(検索文字列, 対象, 開始位置)
引数の内容は、SEARCHと同じです。 |


処理内容:検索文字位置を文字列の先頭から数えます。
Sub Instr_1()
Mystr = "xxxx@sa.starcat.ne.jp"
MsgBox "@マークは先頭から" & InStr(Mystr, "@") & "文字にあります" '
5 を表示
End Sub
処理内容:検索文字位置を文字列の最後から数えます。
Sub Instr_2()
Mystr = "xxxx@sa.starcat.ne.jp"
MsgBox "@マークは先頭から" & InStrRev(Mystr, "@") & "文字にあります" '
5 を表示
End Sub
|
2 Find(ワークシート関数)により検索文字位置を数える |
処理内容:検索文字位置を1文字を 1 として数えます
Sub Find_1()
SearchWord = "ピ"
MsgBox WorksheetFunction.Find(SearchWord, "コンピュータ") '
3 を表示
End Sub
処理内容:検索文字位置をバイト単位で数えます
Sub Find_2()
SearchWord = "ピ"
MsgBox WorksheetFunction.FindB(SearchWord, "コンピュータ") '
5 を表示
End Sub
|
3 Search(ワークシート関数)により検索文字位置を数える |
処理内容:検索文字位置を文字単位で数えます(ABCは2バイト文字使用)
Sub Find_1()
SearchWord = "a"
MsgBox WorksheetFunction.Search(SearchWord, "ABCabc") '
4 を表示
End Sub
処理内容:検索文字位置をバイト単位で数えます(ABCは2バイト文字使用)
Sub Find_2()
SearchWord = "a"
MsgBox WorksheetFunction.SearchB(SearchWord, "ABCabc") '
7 を表示
End Sub
|
4 数値と文字列が混在するデータから数値の位置を検索。 |
処理内容:文字列中の数値の位置を検索します
Sub IsNumeric_1()
Dim myString As String, i As Integer
myString = "ABC123"
For i = 1 To Len(myString)
If IsNumeric(Mid(myString, i, 1)) = True Then
MsgBox i & "番目が数値です" '
4 を表示
Exit For
End If
Next i
End Sub
処理内容:文字列と数値が入り乱れている場合に数値だけを取します
Sub IsNumeric_2()
Dim myString As String, i As Integer, myNumber As String
myString = "A1B2C3"
For i = 1 To Len(myString)
If IsNumeric(Mid(myString, i, 1)) = True Then
myNumber = myNumber & Mid(myString, i, 1)
End If
Next i
MsgBox myNumber ' 123 を表示
End Sub


検索文字列が存在するセル位置を検索
指定されたセル範囲の中で特定の情報を検索してセル位置を取得するには、通常、Find
メソッドを使用します。
Find メソッドは、指定されたセル範囲の中で特定の情報を検索し、情報が見つかった最初のセルを返します。検索の条件にあてはまるセルが見つからなかった場合は、Nothing を返します。
[ Find メソッドの構文 ]
expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte)
expression は、検索対象範囲を指定します。引数の内容は、下表のとおりです。
引 数 |
内 容 |
What |
必ず指定します。対象セル範囲内で検索するデータです。文字列など、セル内のデータに該当する値を指定します。 |
After |
省略可能です。指定したセルの次から検索が開始されます。対象セル範囲の中の、単一セルを指定します。対象セル範囲の途中から検索したいときに指定します。
この引数を省略すると、対象セル範囲の左上端のセルが検索の開始点となります。 |
LookIn |
省略可能です。検索内容を指定します。省略すると
xlValues と見なされます。 |
定 数 |
内 容 |
xlFormulas |
計算式 |
xlValues |
文字・数値 |
xlComments |
コメント |
LookAt |
省略可能です。検索対象部分を指定します。省略すると
xlPart と見なされます。 |
定 数 |
内 容 |
xlPart |
検索対象の一部分でも検索内容と一致していれば検索します。 |
xlWhole |
検索内容と全て一致したセルのみ検索します。 |
SearchOrder |
省略可能です。検索時の行・列の優先順序を指定します。行列ともに複数の対象範囲を検索するとき、省略すると行が優先されます。 |
定 数 |
内 容 |
xlByColumns |
列を優先 |
xlByRows |
行を優先 |
SearchDirection |
省略可能です。検索方向を指定します。省略すると xlNext とみなされます。 |
定 数 |
内 容 |
xlNext |
行の時は左から右、列の時は上から下に検索します。
既定値。 |
xlPrevious |
行の時は右から左、列の時は下から上に検索します。 |
MatchCase |
大文字・小文字を区別するかどうかを指定します。 |
定 数 |
内 容 |
True |
大文字・小文字を区別します。 |
False |
大文字・小文字を区別しません。既定値。 |
MatchByte |
全角・半角を区別するかどうかを指定します。 |
定 数 |
内 容 |
True |
全角・半角を区別します。 |
False |
全角・半角を区別しません。既定値 |


処理内容:指定範囲の中から検索文字列が見つかった最初のセル座標を求めます
Sub Find_1()
Dim SearchWord As String,FR As Range
SearchWord = "テキスト"
With Worksheets("Sheet1").Range("A1:C5")
Set FR = .Find(What := SearchWord,LookIn := xlValues,LookAt := xlWhole)
If Not FR Is Nothing Then
MsgBox FR.Address
End If
End With
Set FR = Nothing
End Sub
処理内容:指定行の中から検索文字列が見つかった最初の列番号を求めます
Sub Find_2()
Dim SearchWord As String,FR As Range
SearchWord = "テキスト"
With Worksheets("Sheet1").Rows(1)
Set FR = .Find(SearchWord)
If Not FR Is Nothing Then
MsgBox FR.Column
End If
End With
Set FR = Nothing
End Sub
処理内容:指定列の中から検索文字列が見つかった最初の行番号を求めます
Sub Find_3()
Dim SearchWord As String,FR As Range
SearchWord = "テキスト"
With Worksheets("Sheet1").Columns(1)
Set FR = .Find(SearchWord)
If Not FR Is Nothing Then
MsgBox FR.Rows
End If
End With
Set FR = Nothing
End Sub
処理内容:リスト範囲の1行目を検索して検索データが見つかった件数を求めます
Sub Find_4()
Dim TargetStr As String,LastRow As Integer
Dim TargetArea As Range,FoundCell As Range
Dim R As Integer,N As Integer
TargetStr = "テキスト"
LastRow = Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
Set TargetArea = Range(Cells(1, 1), Cells(LastRow, 1))
Set FoundCell = TargetArea.Find(What:=TargetStr, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False)
If Not FoundCell Is Nothing Then
R = FoundCell.Row
MsgBox "最初の検索行=" & R
N = 1
Do
Set FoundCell = TargetArea.FindNext(After:=FoundCell)
If FoundCell.Row = R Then Exit Do
N = N + 1
MsgBox N & "番目の検索行=" & FoundCell.Row
Loop
Else
MsgBox "該当データがありません", vbCritical
End If
MsgBox "見つかった件数 = " & N
Set FoundCell = Nothing
Set TargetArea = Nothing
End Sub
処理内容:選択範囲で、値が10のセルの文字フォントを赤色にする
Sub Find_5()
Dim FR As Range, FirstAddress As String
With Worksheets("Sheet1").Range("A1").CurrentRegion
Set FR = .Find(10, LookIn:=xlValues)
If Not FR Is Nothing Then
FirstAddress = FR.Address
Do
FR.Font.Color = RGB(255, 0, 0)
Set FR = .FindNext(FR)
Loop While Not FR Is Nothing And FR.Address <> FirstAddress
End If
End With
Set FR = Nothing
End Sub

